package com.wmx.active_mq_1;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * 消息消费者
 */
@SuppressWarnings("all")
public class JmsReceiver {
    public static void main(String[] args) {
        Connection connection = null;
        Session session = null;
        try {
            String brokerURL = "tcp://127.0.0.1:61616";//ActiveMQ 中间件连接地址
            /**
             * 创建 javax.jms.ConnectionFactory 连接工厂
             * org.apache.activemq.ActiveMQConnectionFactory 中默认设置了大量的参数，还有几个重载的构造器可以选择
             */
            ConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
            //如果 ActiveMQ 连不上，则抛异常：java.net.ConnectException: Connection refused: connect
            connection = mqConnectionFactory.createConnection();//通过连接工厂获取连接 javax.jms.Connection
            connection.start();//启动连接，同理还有 stop、close

            /**
             * Session createSession(boolean transacted, int acknowledgeMode) 创建会话
             * transacted ：表示是否开启事务
             * acknowledgeMode：表示会话确认模式
             * 关闭事务，自动确认：表示 receive 方法、MessageListener.onMessage 方法返回后就已经确认了
             */
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            /**
             * createQueue(String queueName)：创建消息队列，指定队列名称，消费者可以根据队列名称获取消息
             * Destination 目的地，重点，interface Queue extends Destination
             */
            Destination destination = session.createQueue("queue-app");

            //createProducer(Destination destination)：根据目的地创建消息消费者
            MessageConsumer consumer = session.createConsumer(destination);
            int massageTotal = 5;
            for (int i = 0; i < massageTotal; i++) {
                Message message = consumer.receive();//receive方法会导致当前线程阻塞，指导接收到消息
                if (message instanceof MapMessage) {
                    MapMessage mapMessage = (MapMessage) message;//消费者接收消息。因为对方发送的 Map 消息，所以可以强转
                    System.out.print((i + 1) + "：" + mapMessage.getStringProperty("token"));//获取属性
                    System.out.print("：" + mapMessage.getIntProperty("expires"));//获取属性
                    System.out.println("：" + mapMessage.getString("key"));//获取消息内容
                    mapMessage.acknowledge();//应答/确认消息
                }
            }
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            if (session != null) {
                try {
                    session.close();//关闭会话
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();//关闭连接
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
